/**
 * 项目名称: 表达式求值.cpp
 * 项目路径: study/DataStructure/数据结构/栈/应用
 * 编辑时间: 2024年07月12日08时08分49秒
 * 用   户: 轻尘
 */

#include <bits/stdc++.h>

using namespace std;

// 定义操作数栈和操作符栈
stack<int> num;
stack<char> op;

/**
 * 弹出栈顶两个操作数 a, b
 * 弹出栈顶操作符 c
 * 根据操作符,将 a, b做运算得到的结果 x压入栈中
 */
void eval() {
    int b = num.top();
    num.pop();
    int a = num.top();
    num.pop();
    char c = op.top();
    op.pop();

    int x;
    if (c == '+')x = a + b;
    else if (c == '-')x = a - b;
    else if (c == '*')x = a * b;
    else x = a / b;
    num.push(x);
}


int main() {
    // 读入表达式字符串
    string s;
    cin>>s;

    // 定义四个操作符的优先级;加减的优先级比乘除低,加减为 1 ,乘除为 2
    map<char , int> mp={{'+', 1},{'-',1},{'*',2},{'/',2}};

    for(int i = 0;i<s.size() ; i++){
        // 四种情况对应的应该是数组 ,左括号 ,右括号 ,操作符
        //TODO isdigit(参数) 检查参数是否是数字,是的话返回参数,否则返回0
        if(isdigit(s[i])){
            // operand中存储操作数,因为操作数在字符串中可能有连续几位
            int j = i,operand = 0;
            // 将字符串转为数字
            while (j<s.size() && isdigit(s[j])){
                operand = operand * 10 + s[j] - '0';
                j++;
            }
            num.push(operand);// 将操作数压入栈中
            i = j -1;
        }else if(s[i] == '('){
            op.push(s[i]);// 左括号压入栈
        }else if(s[i] == ')'){
            // 右括号一直匹配,直到碰到左括号
            while (op.top() != '(')eval();
            op.pop(); // 最终的左括号不加入栈中
        }else{
            // 若栈不为空且没有碰到左括号且栈顶元素的优先级大于等于该操作符的优先级
            while (op.size() && op.top() != '(' && mp[op.top()] >= mp[s[i]])eval();
            op.push(s[i]);// 将操作符压入栈中
        }
    }

    // 操作到运算符栈空为止
    while (op.size())eval();
    // 最后运算符栈顶保存的元素即为最后表达式的值
    cout<<num.top()<<endl;
    return 0;
}
